home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
ASCIISRC.ZIP
/
DONITSI.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-10-14
|
5KB
|
184 lines
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <mem.h>
#include <stdlib.h>
char *ctable=" ·-■+o░▒O$@▓█";
//char *ctable=" ░░░░▒▒▒▒▓▓▓▓██";
#include "torus.dat"
extern void waittof(void);
#define COSADD (256)
#define put_char(x,y,character) \
((*(unsigned char far *) MK_FP(0xb800,160*(y)+2*(x)))=(character))
#define put_color(x,y,color) \
((*(unsigned char far *) MK_FP(0xb800,160*(y)+2*(x)+1))=(color))
extern int cos[1025];
extern int sin[1025];
unsigned char buffer[16000];
struct vertex_data_s rotated_vertex_data[VERTEXES];
void rotate(int angle,int zoomfactor,int moveplc)
{
for (int i=0;i<VERTEXES;i++)
{
struct vertex_data_s *dest=&rotated_vertex_data[i];
struct vertex_data_s *src=&vertex_data[i];
float X=src->Z*(sin[zoomfactor]+32000.0)/16384.0;
float Y=src->X*(sin[zoomfactor]+32000.0)/16384.0;
float Z=src->Y*(sin[zoomfactor]+32000.0)/16384.0;
dest->X=(X*sin[(angle+COSADD)&1023]+Z*sin[angle&1023])/32768.0;
dest->Y=Y/8.0;
dest->Z=(-X*sin[angle&1023]+Z*sin[(angle+COSADD)&1023])/32768.0;
//X=dest->X;
//Y=dest->Y;
//Z=dest->Z;
//dest->X=X;
//dest->Y=(X*sin[(angle/2+COSADD)&1023]+Y*sin[(angle/2)&1023])/32768.0;
//dest->Z=(-X*sin[(angle/2)&1023]+Y*sin[(angle/2+COSADD)&1023])/32768.0;
dest->X=dest->X/8.0+40.0+((50.0*sin[moveplc&1023])/16384.0);
dest->Y=dest->Y/2+25.0+((20.0*sin[(moveplc*2)&1023])/16384.0);
dest->Z=dest->Z/2;
}
}
void fline(int x1,int x2,int y,int color)
{
register int x;
if (x1>x2) {int temp=x1;x1=x2;x2=temp;}
if (x1<0) x1=0;
if (x2>79) x2=79;
if (x2<0) return;
if (x1>79) return;
if (x1>x2) return;
if (y<0 || y>50) return;
if (x1==x2) return;
unsigned *p=//(unsigned far *)MK_FP(0xb800,160*y+x1*2);
(unsigned *)(buffer+160*y+x1*2);
register unsigned value=0x1000+ctable[color];
for (x=x1;x<=x2;x++) {
*p++=value;
}
}
struct face_data_s sorted_face_data[FACES];
int compare_face(const void *a,const void *b)
{
struct face_data_s *A=(struct face_data_s*)a,*B=(struct face_data_s*)b;
if (rotated_vertex_data[A->A].Z > rotated_vertex_data[B->A].Z)
return -1;
else if (rotated_vertex_data[A->A].Z < rotated_vertex_data[B->A].Z)
return 1;
return 0;
}
void sortfaces(void)
{
struct face_data_s *src=face_data;
struct face_data_s *dest=sorted_face_data;
memcpy(dest,src,sizeof(struct face_data_s)*FACES);
qsort((void*)dest,FACES,sizeof(struct face_data_s),compare_face);
}
#define min(x,y) ((x)<(y)?(x):(y))
void fillpoly(int facenbr,int color)
{
int y;
struct face_data_s *face=&sorted_face_data[facenbr];
struct vertex_data_s *A=&rotated_vertex_data[face->A];
struct vertex_data_s *B=&rotated_vertex_data[face->B];
struct vertex_data_s *C=&rotated_vertex_data[face->C];
struct vertex_data_s E,F;
E.X=A->X - B->X;
E.Y=A->Y - B->Y;
//E.Z=A->Z - B->Z;
F.X=A->X - C->X;
F.Y=A->Y - C->Y;
//F.Z=A->Z - C->Z;
//float rx=E.Y*F.Z - E.Z*F.Y;
//float ry=E.Z*F.X - E.X*F.Z;
float rz=E.X*F.Y - E.Y*F.X;
if (rz > 0) return;
color=(int)(-A->Z/16+5)&15;
struct vertex_data_s *AA = (A->Y <= B->Y) ? A : B;
AA = (AA->Y < C->Y) ? AA : C;
struct vertex_data_s *CC = (A->Y >= B->Y) ? A : B;
CC = (CC->Y > C->Y) ? CC : C;
if (AA->Y==CC->Y) return;
struct vertex_data_s *BB=A;
if ((BB==AA) || (BB==CC)) BB=B;
if ((BB==AA) || (BB==CC)) BB=C;
int height1=BB->Y - AA->Y;
int height2=CC->Y - BB->Y;
int height3=CC->Y - AA->Y;
int CX1=AA->X*256,CX2=AA->X*256;
int DX1;
if (height1==0) DX1=0; else DX1=(BB->X - AA->X)*256/height1/2;
int DX2;
if (height3==0) DX2=0; else DX2=(CC->X - AA->X)*256/height3/2;
for (y=AA->Y; y<=BB->Y; y++)
{
fline(CX1/256,CX2/256,y,color);
CX1+=DX1; CX2+=DX2;
}
if (height2==0) DX1=0; else DX1 = (CC->X - BB->X)*256 / height2;
CX1=BB->X*256;
for ( ; y<=CC->Y ;y++)
{
fline(CX1/256,CX2/256,y,color);
CX1+=DX1; CX2+=DX2;
}
}
void rotating_torus(int frame)
{
// face_data[0].A=0;
// face_data[0].B=1;
// face_data[0].C=2;
// rotated_vertex_data[0].X=70;
// rotated_vertex_data[0].Y=5;
// rotated_vertex_data[0].Z=4;
// rotated_vertex_data[1].X=72-frame;
// rotated_vertex_data[1].Y=19.5;
// rotated_vertex_data[1].Z=5;
// rotated_vertex_data[2].X=25;
// rotated_vertex_data[2].Y=20;
// rotated_vertex_data[2].Z=5;
// rotate(frame);
// fillpoly(0,5);
// getch();
// _fmemset(MK_FP(0xb800,0),' ',8000);
// return;
int i;
rotate(frame*15,frame,frame*4);
sortfaces();
waittof();
_fmemcpy(MK_FP(0xb800,0),buffer,8000);
memset(buffer,' ',8000);
for (i=0;i<FACES;i++)
{
fillpoly(i,31-((i>>3)&31));
}
}